﻿using System;

// ОПЕРАТОРЫ ЯЗЫКА C#

class CSOperators
{
    public static void Main()
    {
        int result;
        for (int i = -5; i < 6; i++)
        {
            result = i != 0 ? 100 / i : 0;
            Console.WriteLine("100 / {0} = {1}", i, result);
        }
        Console.ReadLine();
    }

    // Простое деление и деление по модулю
    public void ModDevOper()
    {
        double d = 11.0;
        Console.WriteLine("{0} делить на {1} равно {2}", d, 3.0d, d / 3.0d);
        Console.WriteLine("{0} делить по модулю {1} равно {2}", d, 3.0d, d % 3.0d);
        Console.ReadLine();
    }

    // Различие между префиксом и постфиксом

    private void PostPrevOper()
    {
        int x = 1, y;
        for (int i = 1; i < 10; i++)
        {
            y = x + x++;
            Console.WriteLine("Ряд для постфиксного инкримента: y = x + x++ = {0}", y);
        }
        Console.WriteLine();

        x = 1;
        for (int i = 0; i < 10; i++)
        {
            y = x + ++x;
            Console.WriteLine("Ряд для префиксного инкримента: y = x + ++x = {0}", y);
        }

        Console.ReadLine();
    }

    // Логические операторы на примеры Импликации. 
    // Принимает ложное значение только в том случае, если слева-правда, а справа - ложь.
    private void Implication()
    {
        bool l = false, r = false;

        for (int i = 0; i < 2; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                if (i == 0) l = true;
                if (i == 1) l = false;
                if (j == 0) r = true;
                if (j == 1) r = false;

                Console.WriteLine("l = {0}; r = {1}", l, r);
                Console.WriteLine("Результат имплекации: {0}", (!l | r));
            }
        }
        Console.ReadLine();
    }

    // Разница между сокращенными и несокращенными логическими операторами
    private void ShortcatLogOpers()
    { 
        int i = 1;
        
        if (false && ++i < 100)
            Console.WriteLine("Эта строка выведена не будет");
        Console.WriteLine("Сокращенное логическое И. i = {0}", i);
        
        i = 1;

        if (false & ++i < 100)
            Console.WriteLine("Эта строка выведена не будет");
        Console.WriteLine("Несокращенное логическое И. i = {0}", i);

        Console.ReadLine();

    }

    // Использование поразрядного оператора И
    // для превращения любого нечетного числа в четное (ushort)
    private void MakeEven()
    {
        for (int i = 0; i < 10; i++)
        {
            ushort d = (ushort)(i & 0xFFFE); // i & 1111 1110. Смещаем последний разряд
            Console.WriteLine("Число {0} после преобразования равно {1}", i, d);
        }

        Console.ReadLine();
    }

    // Использование поразрядного оператора И для определения четности числа.
    private void IsOdd()
    {
        for (ushort i = 1; i < 16; i++)
        {
            if ((i & 1) == 1)
                Console.WriteLine("Число {0} является нечетным", i);
            else
                Console.WriteLine("Число {0} является четным", i);
        }

        Console.ReadLine();
    }

    // Использование подразрядного или для 
    // превращения любого четного числа в нечетное
    private void MakeOdd()
    {
        for (ushort i = 1; i < 16; i++)
        {
            ushort d = (ushort)(i | 1); // i | 0000 0001
            Console.WriteLine("Число {0} после преобразования равно {1}", i, d);
        }
        Console.ReadLine();
    }

    // Использование поразрядного исключающего ИЛИ для шифрования и дешифрования
    private void Encode()
    {
        char x1 = 'F';
        char x2 = 'B';
        char x3 = 'I';

        int mask = 88;

        x1 = (char)(x1 ^ mask);
        x2 = (char)(x2 ^ mask);
        x3 = (char)(x3 ^ mask);

        Console.WriteLine("Шифрованное сообщение - {0}{1}{2}", x1, x2, x3);

        x1 = (char)(x1 ^ mask);
        x2 = (char)(x2 ^ mask);
        x3 = (char)(x3 ^ mask);

        Console.WriteLine("Дешифрованное сообщение - {0}{1}{2}", x1, x2, x3);

        Console.ReadLine();
    }

    // Умножение и деление с помощью поразрядных сдвигов
    private void MultDev()
    {
        int n = 10;
        Console.WriteLine("n * 2 = {0}", n = n << 1);
        Console.WriteLine("n * 4 = {0}", n = n << 2);
        n = 80;
        Console.WriteLine("n / 2 = {0}", n = n >> 1);
        Console.WriteLine("n / 4 = {0}", n = n >> 2);
        Console.WriteLine("n * 2^30 = {0}", n = n << 30);

        Console.ReadLine();
    }

    // Тернарный оператор ?
    // Обход деления на ноль
    private void IsNotNull()
    {
        int result;
        for (int i = -5; i < 6; i++)
        {
            result = i != 0 ? 100 / i : 0;
            Console.WriteLine("100 / {0} = {1}", i, result);
        }
        Console.ReadLine();
    }
}